<?php
/**
 * file缓存操作类
 * 以数据表为单位
 * @author yangzhiguo0903@163.com
 */
defined('IN_LK') or die('Access Denied');
final class cache_file
{
	
	/**
	 * @access public 
	 * 缓存路径
	 */
	public $cache_path = CACHE_PATH;
	
	/**
	 * 缓存类型 array 或 serialize 或 json
	 */
	private $type = 'array';
	
	/**
	 * 初始化获取配置
	 */
	public function __construct()
	{
		
	}
	
	/**
	 * filename 统一接口
	 */
	private function filename($filename, $path = '')
	{
		return $path ? $path . $filename . '.cache.php' : $this->cache_path . $filename . '.cache.php';
	}
	
	/**
	 * 按缓存类型格式化数组数据
	 * @access private
	 * @param mixed $data   想格式化或反格式化的数据
	 * @param int   $format 1格式化0反格式化
	 */
	private function type($data, $format = 1)
	{
		$return = null;
		switch($this->type)
		{
			case 'json':
				$return = $format ? "<?php\r\nreturn \"" . addslashes(json_encode($data)) . "\";\n?>" : json_decode($data, true);
				break;
			case 'serialize':
				$return = $format ? "<?php\r\nreturn \"" . addslashes(serialize($data)) . "\";\n?>": unserialize($data);
				break;
			case 'array':
			default:
				$return = $format ? "<?php\r\nreturn " . var_export($data, true) . ";\n?>" : $data;
				break;
		}
		return $return;
	}
	
	/**
	 * 将数据库中内容取出写入文件
	 * @param string $filename 文件名
	 * @param array  $data     数据
	 * @param string $path     文件路径 需带/
	 * @return int   文件长度
	 */
	public function set($filename, $data)
	{
		if(!is_array($data))
		{
			return false;
		}
		$cachefile = $this->filename($filename);
		$content   = $this->type($data, 1);
		$len   = file_put_contents($cachefile, $content);
		@chmod($cachefile, 0777);
		return (boolean)$len;
	}
	
	/**
	 * 读取文本缓存
	 * @param string $filename 文件名
	 * @return array 文件内数组
	 */
	public function get($filename)
	{
		$filename = $this->filename($filename);
		if(!is_file($filename))
		{
			return array();
		}
		$data = include $filename;
		return $this->type($data, 0);
	}
	
	/**
	 * 删除指定的缓存
	 */
	public function delete($filename)
	{
		$filename = $this->filename($filename);
		if(!is_file($filename))
		{
			return false;
		}
		return @unlink($filename);
	}
}